// 1. 使用node的http模块创建一个服务,并监听端口
// 2. 把创建的http服务升级成基于webscoekt协议的,生成了一个Socket服务
// 3. 监听Socket服务的链接成功的事件
// 4. 客户端链接服务端的时候需要把自己的id传给服务端
// 5. 服务端连接成功的时候需要拿到传过来的用户ID，并且给每个用户生成一个独有的socket实例
// 6. 构造聊天室，本质上就是用户id和socket实例id的对应关系的对象
// 7. 发送消息
//    - 1. 客户端----》服务端：服务端注册(监听)事件，客户端: 触发事件
//    - 2. 服务端找发送人的socketId:找这条消息是发送给谁的，通过消息中的toId(接收人的用户ID)在聊天室对象中找到目标人的socket实例的id
//    - 3. 服务端----》客户端：客户端注册(监听)事件，服务端：触发事件
// 8. 心跳测检测
//   - 客户端只要连接socket服务成功了，每隔一段时间我就发送一个消息（ping事件），这个消息不是聊天的消息
//   - 服务端接收到消息，啥也不干，触发客户端注册的pang事件
// 9. 断线重连
//   - 1. 服务已经连接成功，突然断开
//   - 2. 服务没有连接成功过，链接的时候直接报错了

// 10. 自动回复
//  - 1. 客户端发送一个消息，先把消息给目标人发过去
//  - 2. 服务端 判断消息的内容是否命中某个关键字
//  - 3. 如果命中了某个关键字，站在目标人的角度给发送人客户端回复消息，同时把消息也发送给目标人

// 11. 发送表情 跟服务端没啥关系了
// 定义关键词和回复内容, ‘你好啊’
const autoMessageKey = [
  {
    keys: ["你好", "您好", "hello", "hi"],
    message: "您好，您想要咨询些什么问题",
  },
  { keys: ["价格", "钱"], message: "价格是100元" },
];

const kefuIds = ["zxy", "ldh", "gfc", "lm"];

const { Server } = require("socket.io");
// 1
const http = require("http");

const httpServer = http.createServer();

//2
const IO = new Server(httpServer, {
  path: "/mysocket",
});

// 6
const chatRoom = {};
// 3
IO.on("connection", (socket) => {
  console.log("客户端链接服务成功");
  // 5
  const { id } = socket.handshake.query;
  console.log("服务端给id为" + id + "的用户生成的socket的id是" + socket.id);
  if (id) {
    chatRoom[id] = socket.id;
  }
  // 注册(监听)事件
  socket.on("sendMsg", (info) => {
    console.log(
      "服务端接收到了客户端发来的消息，消息内容是" + JSON.stringify(info)
    );
    const { fromId, toId, message } = info;
    // {formId: 'bin', toId: 'zjx', message: '你好啊'}
    socket.to(chatRoom[toId]).emit("reciveMsg", info);
    // 如果接收人是客服的话，才有自动回复
    if (typeof message === 'string' && kefuIds.includes(toId)) {
      // 构造自动回复给 'bin'(发送人) 的消息
      autoMessageKey.map((item) => {
        if (item.keys.some((key) => message.indexOf(key) !== -1)) {
          const messageObj = {
            fromId: toId,
            toId: fromId,
            message: item.message,
          };
          // messageObj {fromId: 'zjx', toId: 'bin', message: '您好，您想要咨询些什么问题'}

          // 谁发的就发给了谁
          socket.emit("reciveMsg", messageObj);

          // 把构造的自动回复的消息，发送给 'zjx'(接收人)
          socket.to(chatRoom[messageObj.fromId]).emit("reciveMsg", messageObj);
        }
      });
    }
  });

  // 注册一个心跳检测的事件
  socket.on("ping", () => {
    // 服务端接受到ping事件，直接触发客户端的pang事件
    socket.emit("pang");
  });
  console.log("现在聊天室对象是" + JSON.stringify(chatRoom));
});

httpServer.listen(3000, () => {
  console.log("服务启动成功了,端口是3000");
});
